热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

03_12_JavaWeb||day14_ServletHTTPRequest||day14_ServletHTTP协议Request

今日内容:1.Servlet2.HTTP协议3.Request1.Servlet:概念步骤执行原理生命周期Servlet3.0注解配置Servl
今日内容:

1. Servlet
2. HTTP协议
3. Request

1. Servlet:


  1. 概念
  2. 步骤
  3. 执行原理
  4. 生命周期
  5. Servlet3.0 注解配置
  6. Servlet的体系结构
    • 出现的意义:++由于我们一般只用service方法,但是每次都要重写其他4个方法。++

    //从上到下爷孙三人Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet -- 抽象类

    • GenericServlet【开发时不用这个】:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
      • ++将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可++

      @WebServlet("/demo2")public class ServletDemo2 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("demo2...");}//想重写那个方法自己手动添加即可(输入init)}

    • HttpServlet【开发时用这个】:对http协议的一种封装,简化操作
      • HttpServlet原理(对http协议的一种封装,简化操作)
        • 上面是原本要写的代码(多)
        • 下面就是复写两个方法就可以了
      • 使用步骤
        1. 定义类继承HttpServlet
        2. 复写(重写)doGet/doPost方法
      • 演示:(注:通过浏览器访问时get请求)

        @WebServlet("/demo3")public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");}}

  7. Servlet相关配置
    1. urlpartten:Servlet访问路径
      1. 一个Servlet可以定义多个访问路径 :

        @WebServlet({"/d4","/dd4","/ddd4"})

      2. 路径定义规则:
        1. /xxx:路径匹配
        2. /xxx/xxx:多层路径,目录结构(作为了解)
        3. *.do:扩展名匹配(作为了解,前面不能加/)
        • 演示:

        //第一种:@WebServlet("/d4")//第二种:表示三个都可以访问@WebServlet({"/d4","/dd4","/ddd4"})//第三种:表示有层级关系,都写才可以@WebServlet({"/user/d4")//第四种:表示user后面跟什么都可以被访问(访问权限最低)@WebServlet({"/user/*")//第五种:必须要加.do,且前面不能加/@WebServlet({"*.do")

        • *号表示写什么都可以,不写也行

2. HTTP【重点】:


  1. 概念:Hyper Text Transfer Protocol 超文本传输协议
    • 传输协议:++定义了,客户端和服务器端通信时,发送数据的格式++(格式如果不统一则没办法进行解析动作)
    • 特点【知道】:
      1. ++基于TCP/IP的高级协议++
        • 简述TCP和UDP
          • TCP:安全的,通过三次握手来确保双方都连接通畅,传输速度慢,不会丢失数据
          • UDP:不是很安全,且传输过程有可能丢失数据(优点:快)–>常用到语音的发送
      2. ++默认端口号++:80
      3. ++基于请求/响应模型的++:一次请求对应一次响应
      4. ++无状态的++:每次请求之间相互独立,不能交互数据
    • 历史版本【了解】:
      • 1.0:每一次请求响应都会建立新的连接
      • 1.1:复用连接
        • 简述:就是请求一个连接后就会等一会如果有新的请求,就会复用刚才的链接,否则就释放链接
  2. 请求消息数据格式
    • 页面中f12–>Network–>点入访问页面–>Headers
    1. 请求行
      • 格式:

        请求方式 请求url 请求协议/版本GET /login.html HTTP/1.1

      • 请求方式:
        • ++HTTP协议有7中请求方式,常用的有2种++
          • GET:
            1. 请求参数在请求行中,(在url后。)【重点】
            2. 请求的++url长度有限制++的
            3. 不太安全(请求参数在网址后面跟着)
          • POST:
            1. 请求参数在请求体中【重点】
            2. 请求的++url长度没有限制++的
            3. 相对安全
    2. 请求头:++客户端浏览器告诉服务器一些信息++
      • 格式:

        请求头名称: 请求头值

      • 常见的请求头:
        1. User-Agent:++浏览器告诉服务器,我访问你使用的浏览器版本信息++
          • 不同浏览器可以在服务器端获取该请求头的信息,解决浏览器的兼容性问题
        2. Referer:http://localhost/login.html
          • 告诉服务器,我(当前请求)从哪里来?
            • 作用:
              1. 防盗链:
              2. 统计工作:
    3. 请求空行
      • 格式:

        空行,就是用于分割POST请求的请求头,和请求体的。

    4. 请求体(正文):(GET中就没有)
      • 格式:

        封装POST请求消息的请求参数的username=zhangsan

    • 字符串格式:

      //请求行和请求头一起的//请求行(请求方式 请求url 请求协议/版本)POST /login.html HTTP/1.1//请求头Host: localhost //请求主机User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //告诉服务器,作为浏览器可以响应什么样的信息格式Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2//告诉服务器,作为浏览器可以支持的语言环境Accept-Encoding: gzip, deflate//告诉服务器,作为浏览器可以压缩的格式Referer: http://localhost/login.htmlConnection: keep-alive//连接可以被复用Upgrade-Insecure-Requests: 1//关于升级的//请求空行//请求体username=zhangsan

  3. 响应消息数据格式

3. Request:


  1. request对象和response对象的原理
    • 下图是重点【掌握】
    1. request和response对象是由服务器创建的我们来使用它们
    2. request对象是来获取请求消息,response对象是来设置响应消息(比如通过获取的消息能)
  2. request对象继承体系结构【了解】:

    ServletRequest-->接口(实现Servlet接口时候重写的service方法中的对象)| HttpServletRequest接口继承ServletRequest接口HttpServletRequest-->接口(继承HttpServlet类时候重写的doGet方法中的对象)| RequestFacade类实现了HttpServletRequest接口RequestFacade 类(tomcat编写的,包路径:org.apache.catalina.connector.RequestFacade)

    • ServletRequeset对象【了解】

      @WebServlet("/demo1")public class ServletDemo1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}//这里的参数类型@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("demo1...");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}}

    • HttpServletRequest对象【掌握】

      @WebServlet({"/d4", "/dd4", "/ddd4"})public class ServletDemo4 extends HttpServlet {//这里的参数类型@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("demo4");}}

  3. request功能【重点】:
    1. 获取请求消息数据
      1. 获取请求行数据
        • 格式:

          GET /day14/demo1?name=zhangsan HTTP/1.1

        • 方法:(API中查ServletRequest)
          1. 获取请求方式 :GET
            • String getMethod()
          2. (*)获取虚拟目录【重点掌握】:/day14
            • String getContextPath()
          3. 获取Servlet路径: /demo1
            • String getServletPath()
          4. 获取get方式请求参数:name=zhangsan
            • String getQueryString()
          5. (*)获取请求URI【重点掌握】:/day14/demo1
            • String getRequestURI()
              • /day14/demo1
            • StringBuffer getRequestURL()
              • http://localhost/day14/demo1
            • URI和URL的区别:
              • URI:统一资源标识符 :
                • /day14/requestDemo1共和国
              • URL:统一资源定位符 :
                • http://localhost:8080/day14/requestDemo1 中华人民共和国
          6. 获取协议及版本:HTTP/1.1
            • String getProtocol()
          7. 获取客户机的IP地址:
            • String getRemoteAddr()
        • 案例:

          /*** 演示request对象获取请求行数据*/@WebServlet("/requestDemo1")public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取==请求方式== :GETString method = req.getMethod();System.out.println(method);//2. (*)获取==虚拟目录【重点掌握】==:/day14String contextPath = req.getContextPath();System.out.println(contextPath);//3. 获取==Servlet路径==: /requestDemo1String servletPath = req.getServletPath();System.out.println(servletPath);//4. 获取==get方式请求参数==:name=zhangsanString queryString = req.getQueryString();System.out.println(queryString);//5. (*)获取==请求URI【重点掌握】==:/day14/requestDemo1String requestURI = req.getRequestURI();StringBuffer requestURL = req.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);//6. 获取==协议及版本==:HTTP/1.1String protocol = req.getProtocol();System.out.println(protocol);//7. 获取==客户机的IP地址==:String remoteAddr = req.getRemoteAddr();System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}//结果:GET/day14/requestDemo1name=zhangsan&age=2/day14/requestDemo1http://localhost:8080/day14/requestDemo1HTTP/1.10:0:0:0:0:0:0:1

      2. 获取请求头数据
        • 方法:
          • (*)String getHeader【重点掌握】(++String name++):通过请求头的名称获取请求头的值
          • Enumeration getHeaderNames():获取所有的请求头名称
            • 当做iterator迭代器使用
        • 演示:

          @WebServlet("/requestDemo2")public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//演示获取请求头数据//1.获取所有请求头名称Enumeration headerNames = req.getHeaderNames();//2.遍历while(headerNames.hasMoreElements()){String name = headerNames.nextElement(); //获取到请求头名称//根据名称获取请求头的值String value = req.getHeader(name);System.out.println(name + "----" + value);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}//结果:host----localhost:8080connection----keep-alivecache-control----max-age=0upgrade-insecure-requests----1user-agent----Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36accept----text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9sec-fetch-site----cross-sitesec-fetch-mode----navigatesec-fetch-user----?1sec-fetch-dest----documentaccept-encoding----gzip, deflate, braccept-language----zh-CN,zh;q=0.9COOKIE----JSESSIONID=9EA5C1B4199A1B36420D6F24517E9F8A; JSESSIONID=7AF53FE1F3D0702578BA3E3227A5339B

        • 案例1:获取user-agent请求头数据,来解决浏览器的兼容性问题

          //案例:获取user-agent请求头数据,来解决浏览器的兼容性问题String agent = req.getHeader("user-agent");if(agent.contains("Chrome")){//表示使用的谷歌浏览器System.out.println("谷歌来了。。。");}else if(agent.contains("Firefox")){//表示使用火狐浏览器System.out.println("火狐来了。。。");}

        • 案例2:获取referer请求头数据,来解决防盗链问题和统计工作问题
          • referer是告诉服务器,我(当前请求)从哪里来
          • 不是从别的超链接点击过来的就为null,因为自己请求自己(需要别的网址访问该url)

          String referer = req.getHeader("referer"); //referer是告诉服务器,我(当前请求)从哪里来//从login页面中获取到的http://localhost:8080/day14/login.htmlSystem.out.println(referer); //不是从别的超链接点击过来的就为null,因为自己请求自己(需要别的网址访问该url)//防盗链if(referer != null){ //表示不是自己请求自己if(referer.contains("/day14")){//正常访问://System.out.println("播放电影");//显示到服务器端的方式//这里是response方式//先设置一下可以中文显示resp.setContentType("text/html;charset=utf-8");//再显示到页面上resp.getWriter().write("播放电影...");}else {//盗链//System.out.println("请来正规网址观看电影");//这里是response方式//先设置一下可以中文显示resp.setContentType("text/html;charset=utf-8");//再显示到页面上resp.getWriter().write("请来正规网址观看电影...");}}//本项目访问该的网站demo4...//另一个项目访问该网站demo4...//结果:http://localhost:8080/day14/login.html播放电影http://localhost/index.html请来正规网址观看电影

        • 同时启动两个tomcat操作【重点】
      3. 获取请求体数据:
        • 请求体:++只有POST请求方式,才有请求体++,在请求体中封装了POST请求的请求参数
        • 步骤:
          1. 获取流对象(++通过request获取的,不用关闭++)
          2. 再从流对象中拿数据
            • BufferedReader getReader():获取字符输入流,++只能操作字符数据++
              • 普通表单提交的都是字符的
              • 例子:获取到post请求头数据

                @WebServlet("/requestDemo5")
                public class RequestDemo5 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求消息体-->请求参数//1.获取字符流BufferedReader br = req.getReader();//2.读取数据String line = null;while((line = br.readLine()) != null){System.out.println(line);}}
                }

            • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
              • 在文件上传知识点后讲解
    2. 其他功能【都要掌握】:
      1. ++获取请求参数通用方式++:++不论get还是post请求方式都可以使用下列方法来获取请求参数++
        1. String getParameter【常用与单选框】(String name):根据参数名称获取参数值
          • username=zs&password=123
        2. String[] getParameterValues【常用与复选框】(String name):根据参数名称获取参数值的数组
          • hobby=xx&hobby=game
        3. Enumeration getParameterNames():获取所有请求的参数名称
          • ++复选框的时候只能获取一个++
        4. Map getParameterMap【常用】():获取所有参数的map集合
          • ++就是来解决了复选框的时候只能获取一个的问题++
        • 综合例子:
          • 访问页面:
          • 代码:

          @WebServlet("/requestDemo6")public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//get 请求参数//根据参数名称获取参数值String username = req.getParameter("username");/*System.out.println("get");System.out.println(username);*///结果:getadmin//根据参数名称获取参数值的数组String[] hobbys = req.getParameterValues("hobby");/*for (String hobby : hobbys) {System.out.println(hobby);}*///结果:gamestudy//获取所有请求的参数名称Enumeration parameterNames = req.getParameterNames();/*while(parameterNames.hasMoreElements()){String name = parameterNames.nextElement();System.out.println(name);String parameter = req.getParameter(name);System.out.println(parameter);System.out.println("-----");}*///结果:usernameadmin------------password123465------------hobbygame------------//获取所有参数的map集合Map parameterMap = req.getParameterMap();//遍历Map(使用keySet)/*Set keySet = parameterMap.keySet(); //获取到键for (String key : keySet) {//通过键获取值String[] values = parameterMap.get(key);System.out.println(key);for (String value : values) {System.out.println(value);}System.out.println("------------");}*///结果:usernameadmin------------password123465------------hobbygamestudy------------}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//post 请求参数//根据参数名称获取参数值//因为get,post都可以获取到,所以doPost访问doGet就可以了this.doGet(req, resp);}}

        • ++中文乱码问题++:
          • get方式(通过url获取值):tomcat 8 已经将get方式乱码问题解决了
          • post方式(通过流获取值):会乱码
            • 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
            • 案例:

              @WebServlet("/requestDemo7")public class RequestDemo7 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置流的编码格式(字符集)req.setCharacterEncoding("utf-8");//获取请求参数usernameString username = req.getParameter("username");System.out.println(username);}}

      2. ++请求转发++:一种在服务器内部的资源跳转方式
        1. 步骤:
          1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
          2. 使用RequestDispatcher对象中forward方法来进行转发:forward(ServletRequest request, ServletResponse response)
        2. 特点【面试题】:
          1. ++浏览器地址栏路径不发生变化++
          2. 只能转发到当前服务器内部资源中
          3. 转发只是一次请求
            • 多个资源之间只有一次请求
        3. 案例:将requestDemo8请求转发到requestDemo9中

          //RequestDemo8的doPost中System.out.println("demo8被访问了");//请求转发到requestDemo9中req.getRequestDispatcher("/requestDemo9").forward(req, resp);//RequestDemo9的doPost中System.out.println("demo9被访问了");//结果:demo8被访问了demo9被访问了

      3. 共享数据:
        • 域对象:一个有作用范围的对象,可以在范围内共享数据
        • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
        • 方法:
          1. void setAttribute(String name,Object obj):存储数据
          2. Object getAttribute(String name):通过键获取值
          3. void removeAttribute(String name):通过键移除键值对
        • 演示:

          //RequestDemo8的doPost中System.out.println("demo8被访问了");//在请求转发之前,存储数据req.setAttribute("msg", "hello");//请求转发到requestDemo9中req.getRequestDispatcher("/requestDemo9").forward(req, resp);//RequestDemo9的doPost中//获取数据Object msg = req.getAttribute("msg");System.out.println(msg);System.out.println("demo9被访问了");//结果:demo8被访问了hellodemo9被访问了

      4. 获取ServletContext【现在了解,后面详细学】:
        • ServletContext getServletContext()

4. 案例:用户登录【综合掌握上面的方法】


  1. 用户登录案例需求:
    1. 编写login.html登录页面
      • username & password 两个输入框
    2. 使用Druid数据库连接池技术,操作mysql,day14数据库中user表
    3. 使用JdbcTemplate技术封装JDBC
    4. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
  2. 分析
  3. 开发步骤
    1. 创建项目,导入html页面,配置文件,jar包
    2. 创建数据库环境

      CREATE DATABASE day14;USE day14;CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32) UNIQUE NOT NULL,password VARCHAR(32) NOT NULL);

    3. 创建包cn.itcast.domain,创建类User

      package cn.itcast.domain;/*** 用户的实体类*/public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}

    4. 创建包cn.itcast.util,编写工具类JDBCUtils

      package cn.itcast.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import javax.xml.crypto.Data;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;/*** JDBC工具类 使用Durid连接池*/public class JDBCUtils {private static DataSource ds ;static {try {//1.加载配置文件Properties pro = new Properties();//使用ClassLoader加载配置文件,获取字节输入流InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.初始化连接池对象ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接池对象*/public static DataSource getDataSource(){return ds;}/*** 获取连接Connection对象*/public static Connection getConnection() throws SQLException {return ds.getConnection();}}

    5. 创建包cn.itcast.dao,创建类UserDao,提供login方法

      package cn.itcast.dao;import cn.itcast.domain.User;import cn.itcast.util.JDBCUtils;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;/*** 操作数据库中User表的类*/public class UserDao {//声明JDBCTemplate对象共用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 登录方法* @param loginUser 只有用户名和密码* @return user包含用户全部数据,没有查询到,返回null*/public User login(User loginUser){try {//1.编写sqlString sql = "select * from user where username = ? and password = ?";//2.调用query方法User user = template.queryForObject(sql,new BeanPropertyRowMapper(User.class),loginUser.getUsername(), loginUser.getPassword());return user;} catch (DataAccessException e) {e.printStackTrace();//记录日志return null;}}}

    6. 编写cn.itcast.web.servlet.LoginServlet类

      package cn.itcast.web.servlet;import cn.itcast.dao.UserDao;import cn.itcast.domain.User;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置编码req.setCharacterEncoding("utf-8");//2.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);//4.调用UserDao的login方法UserDao dao = new UserDao();User user = dao.login(loginUser);//5.判断userif(user == null){//登录失败req.getRequestDispatcher("/failServlet").forward(req,resp);}else{//登录成功//存储数据req.setAttribute("user",user);//转发req.getRequestDispatcher("/successServlet").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}}

    7. 编写FailServlet和SuccessServlet类

      @WebServlet("/successServlet")public class SuccessServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取request域中共享的user对象User user = (User) request.getAttribute("user");if(user != null){//给页面写一句话//设置编码response.setContentType("text/html;charset=utf-8");//输出response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");}} @WebServlet("/failServlet")public class FailServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给页面写一句话//设置编码response.setContentType("text/html;charset=utf-8");//输出response.getWriter().write("登录失败,用户名或密码错误");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}

    8. login.html中form表单的action路径的写法
      • 虚拟目录+Servlet的资源路径

      用户名:
      密码:

    9. BeanUtils工具类,简化数据封装(导入:commons-beanutils-1.8.0.jar)
      • 用于封装JavaBean的
      1. JavaBean的基本知识:标准的Java类
        1. 要求:
          1. 类必须被public修饰
          2. 必须提供空参的构造器
          3. 成员变量必须使用private修饰
          4. 提供公共setter和getter方法
        2. 功能:封装数据
        3. 概念:
          • 成员变量:
          • 属性:setter和getter方法截取后的产物
            • 例如:getUsername() --> Username–> username

            private int id;public void setChange(int id) {this.id = id;}//这里属性转换成了change,但是他操作的的还是id

      2. BeanUtils工具类中的方法:
        1. setProperty()
        2. getProperty()
        3. populate(Object obj , Map map):++将map集合的键值对信息,封装到对应的JavaBean对象中++
          • obj操作的属性,不是成员变量
      3. 使用案例:
        • import org.apache.commons.beanutils.BeanUtils;

        //原来:LoginServlet类中//2.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);//替换为://BeanUtils工具类,简化数据封装//2. 获取所有请求参数Map map = req.getParameterMap();//3. 创建User对象User loginUser = new User();//3.2 使用BeanUtils进行封装try {BeanUtils.populate(loginUser, map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}


推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
author-avatar
mobiledu2502910337
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有